// app/vendor/responses/page.tsx import * as React from "react"; import Link from "next/link"; import { Metadata } from "next"; import { getServerSession } from "next-auth/next"; import { authOptions } from "@/app/api/auth/[...nextauth]/route"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { LogIn, FileX, Clock, CheckCircle, AlertTriangle } from "lucide-react"; import { DataTableSkeleton } from "@/components/data-table/data-table-skeleton"; import { Shell } from "@/components/shell"; import { getValidFilters } from "@/lib/data-table"; import { type SearchParams } from "@/types/table"; import { searchParamsVendorResponseCache } from "@/lib/b-rfq/validations"; import { getVendorResponseProgress, getVendorResponseStatusCounts, getVendorRfqResponses } from "@/lib/b-rfq/service"; import { VendorResponsesTable } from "@/lib/b-rfq/vendor-response/vendor-responses-table"; import { InformationButton } from "@/components/information/information-button" export const metadata: Metadata = { title: "응답 관리", description: "RFQ 첨부파일 응답 현황을 관리합니다", }; interface IndexPageProps { searchParams: Promise } export default async function IndexPage(props: IndexPageProps) { const searchParams = await props.searchParams const search = searchParamsVendorResponseCache.parse(searchParams) const validFilters = getValidFilters(search.filters) // 인증 확인 const session = await getServerSession(authOptions); // 로그인 확인 if (!session || !session.user) { return (

응답 관리

{/*

RFQ 첨부파일 응답 현황을 확인하고 관리합니다.

*/}

로그인이 필요합니다

응답 현황을 확인하려면 먼저 로그인하세요.

); } // 벤더 ID 확인 const vendorId = session.user.companyId ? String(session.user.companyId) : "0"; // 벤더 권한 확인 if (session.user.domain !== "partners") { return (

접근 권한 없음

벤더 계정이 필요합니다

벤더 계정으로 로그인해주세요.

); } // 데이터 가져오기 const responsesPromise = getVendorRfqResponses({ ...search, filters: validFilters }, vendorId); // 상태별 개수 및 진행률 가져오기 const [statusCounts, progress] = await Promise.all([ getVendorResponseStatusCounts(vendorId), getVendorResponseProgress(vendorId) ]); // 프로미스 배열 const promises = Promise.all([responsesPromise]); return (

RFQ 응답 관리

RFQ 첨부파일 응답 현황을 확인하고 관리합니다.

{/* 상태별 통계 카드 */}
전체 요청
{progress.totalRequests}건

총 응답 요청 수

미응답
{statusCounts.NOT_RESPONDED || 0}건

응답 대기 중

응답완료
{statusCounts.RESPONDED || 0}건

응답률: {progress.responseRate}%

수정요청
{statusCounts.REVISION_REQUESTED || 0}건

재검토 필요

포기
{statusCounts.WAIVED || 0}건

완료율: {progress.completionRate}%

} >
); }